package com.ubigate.CooknaviHA;

import java.util.Calendar;

import com.ubigate.CooknaviHA.CookingTimerService;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;

public class TimerActivity extends Activity implements OnDismissListener, OnClickListener {
	private static final String TAG = "TimerActivity";

	private Button timer_add10_btn;	//10초 단위 타이머 설정 버튼
	private Button timer_add30_btn;	//30초 단위 타이머 설정 버튼
	private Button timer_set_btn;	//타이머 설정 버튼
	private Button timer_start_btn;	//타이머 시작 버튼
	private Button timer_stop_btn;	//타이머 중지 버튼
	
	private TextView recipe_timer_text;	//타이머 설정 변경시 보여주기 위한 textview

	private Integer nMinutes = 0;	//분단위
	private Integer nSeconds = 0;	//초단위
	
	private Integer nTimer = 0;	//timer설정 전체 초 값 
	
	private CountDownTimer tCookTimer = null;	//countdown타이머 생성
	
	MediaPlayer mp = null;
	
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.timer_h);	//timer_h.xml을 띄움
        super.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//안드로이드화면을 항상 켜놓게 하기위해서 사용

        Log.d(TAG, "TimerActivity");

        timer_add10_btn = (Button) findViewById(R.id.timer_add_10);	//xml에서 선언된 10초추가버튼 선언
        timer_add30_btn = (Button) findViewById(R.id.timer_add_30);	//xml에서 선언된 30초추가버튼 선언
        timer_set_btn = (Button) findViewById(R.id.timer_setup);	//xml에서 선언된 설정버튼 선언
        timer_start_btn = (Button) findViewById(R.id.timer_start);	//xml에서 선언된 시작버튼 선언
        timer_stop_btn = (Button) findViewById(R.id.timer_stop);	//xml에서 선언된 정지버튼 선언

        recipe_timer_text = (TextView) findViewById(R.id.recipe_timer_text);	//xml에선언된 timertext선언 
        
        timer_start_btn.setVisibility(View.VISIBLE);	//start버튼을 보이게
        timer_stop_btn.setVisibility(View.GONE);	//정지버튼 사라지게
        
        recipe_timer_text.setText(String.format("%02d:%02d" ,(nTimer/60), (nTimer%60)));	//textview에 띄우기 위한 format설정
        
        //현재 activity에서 버튼 활성화를 위해 clicklistener설정
        timer_add10_btn.setOnClickListener(this);
        timer_add30_btn.setOnClickListener(this);
		timer_set_btn.setOnClickListener(this);
		timer_start_btn.setOnClickListener(this);
		timer_stop_btn.setOnClickListener(this);
    }
    
    //activity가 종료되기 전에 cleanup함수 정의
    @Override
    public void onDestroy() {
    	Log.d(TAG, "onDestroy");//tomcat에 종료됨을 표시
    	super.onDestroy();//activity종료
    	if (mp != null) mp.stop();//media가 끝나지 않았으면 종료
    	if (tCookTimer != null) tCookTimer.cancel();//countdown 취소
    }
    
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		int viewId = v.getId();
		switch (viewId) {
		//타이머 10초증가 버튼 클릭시
		case R.id.timer_add_10:
			//전체 설정된 타이머 값에 10초를 더함
			nTimer = nTimer + 10;
			//format에 맞게 text 설정
			recipe_timer_text.setText(String.format("%02d:%02d" ,(nTimer/60), (nTimer%60)));
			break;
		//타이머 30초 증가 버튼 클릭시
		case R.id.timer_add_30:
			//전체 설정된 타이머 값에 30초를 더함
			nTimer = nTimer + 30;
			//format에 맞게 text 설정
			recipe_timer_text.setText(String.format("%02d:%02d" ,(nTimer/60), (nTimer%60)));
			break;
		//타이머 설정 버튼 클릭시 ( 사용자 입력에 의한 설정 )
		case R.id.timer_setup:
			//타이머설정을 위한 다이얼로그 생성
			TimerSetDlg timerSetDlg = new TimerSetDlg(this);
			//다이얼로그의 title설정
			timerSetDlg.setTitle("타이머 설정");
			//타이머의 분 값과 초 값을 설정
			timerSetDlg.setTime(nTimer/60, nTimer%60);
			timerSetDlg.setOnDismissListener(this);	//다이얼로그가 닫기위해서
			timerSetDlg.show();	//다이얼로그를 띄움
			break;
		//타이머 시작 버튼 클릭시 
		case R.id.timer_start:
			//0초로 설정될 경우, 아무일도 일어나지 않음
			if (nTimer == 0) break;
			Log.i(TAG, "Cook Timer Start ("+nTimer+")");	//tomcat에 log찍음
	        timer_start_btn.setVisibility(View.GONE);	//시작버튼을 사라지게
	        timer_stop_btn.setVisibility(View.VISIBLE);	//정지버튼을 보이게 
	        // AlarmService Setting
	        setAlarmService(nTimer);//
//			Intent intent = new Intent(TimerActivity.this, CookingTimerService.class);
//			PendingIntent sender = PendingIntent.getBroadcast(TimerActivity.this, 0, intent, 0);
//			Calendar cal = Calendar.getInstance();
//			cal.setTimeInMillis(System.currentTimeMillis());
//			cal.add(Calendar.SECOND, nSeconds);
//			AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
//			am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
	        //CountDownTimer객체를 현재 설정된 밀리세컨드 값과 카운트 다운할 때 얼마 단위로 할지 두개 의 파라미터로 설정
	        tCookTimer = new CountDownTimer(nTimer*1000, 1000) {
	        	//타이머 실행중
				public void onTick(long millisUntilFinished) {																				
					nTimer = nTimer - 1;	//1초에 한번씩 timer값 -1
					recipe_timer_text.setText(String.format("%02d:%02d" ,(nTimer/60), (nTimer%60)));	//nTimer를 text형식에 맞게 textview 설정
				}
				//타이머 종료
				public void onFinish() {
					Log.i(TAG, "Cook Timer End");
					//종료시 00:00으로 text설정
					recipe_timer_text.setText("00:00");
					//종료시 mediaplayer실행
					mp = MediaPlayer.create(TimerActivity.this, R.raw.alarm2);
					mp.setLooping(true);               
					mp.start();
				}
			}.start();//카운트다운시작
			break;
		//타이머 정지 버튼 클릭시
		case R.id.timer_stop:
			Log.i(TAG, "Cook Timer Stop");//tomcat에 타이머 정지메시지 띄움
			//mediaplayer가 실행중이면, 정지시킴
	    	if (mp != null) mp.stop();
	    	//CountDownTimer동작 실행중이면, 취소시킴
	    	if (tCookTimer != null) tCookTimer.cancel();
	        timer_start_btn.setVisibility(View.VISIBLE);//시작버튼 보이게
	        timer_stop_btn.setVisibility(View.GONE);//정지버튼 사라지게
		}
	}
	
	private void setAlarmService(int nSeconds) {
		//intent로 현재 activity에서 CookingTimerService를 띄움
		Intent intent = new Intent(TimerActivity.this, CookingTimerService.class);
		//intent를 바로 활성화 시키지 않고 send됫을때 실행시켜주기 위해 
		PendingIntent sender = PendingIntent.getBroadcast(TimerActivity.this, 0, intent, 0);
		//현재 시간을 설정하기위해 calendar객체 생성
		Calendar cal = Calendar.getInstance();		
		cal.setTimeInMillis(System.currentTimeMillis());
		//초단위로 nSeconds 만큼 설정
		cal.add(Calendar.SECOND, nSeconds);
		//알람을 울리기 위해
		AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
		//알람의 type을 설정해주고 , pendingintent에 startActivity 메소드 호출 
		am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
	}
	//다이얼로그 종료될때 실행되는 메소드 
	public void onDismiss(DialogInterface _dialog) {
		// TODO Auto-generated method stub
		TimerSetDlg dialog = (TimerSetDlg)_dialog;
		//OK버튼을 누를경우 
		if (dialog.getOk()) {
			//다이얼로그를 통해설정된 분 값을 받음
			nMinutes = dialog.getMinutes();
			//다이얼로그를 통해 설정된 초값을 받음
			nSeconds = dialog.getSeconds();
			//전체값을 초단위로 바꿔서 nTimer값 설정
			nTimer = nMinutes*60 + nSeconds;
			//nTimer값을 text형식에 맞게 textview설정
			recipe_timer_text.setText(String.format("%02d:%02d" ,(nTimer/60), (nTimer%60)));
			//tomcat화면에 타이머메시지 띄움
			Log.i(TAG, "타이머 설정 완료  min :"+ nMinutes +", sec :"+ nSeconds);			
		} else {
			Log.i(TAG, "타이머 설정 취소");
		}
	}

}